/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ia_psr.problemas.transportes;

/**
 *
 * @author Rubén Avalos Elvira y Fabiana Celiberti Tapie
 */
import ia_psr.graph.Tarea;
import ia_psr.problemas.Variable;
import java.util.Collections;
import java.util.LinkedList;
public class Conductor extends Variable {
    public LinkedList<Tarea> tareasAsignadas;

    public Conductor(String nombre) {
        super(nombre);
        tareasAsignadas = new LinkedList<Tarea>();
    }

    public String getValue() {
        return (String)value;
    }

    public void setValue(String nombre) {
        value = nombre;
    }

    public String toString() {
        return (value != null) ? value.toString() : "";
    }

    public boolean equals(Object o) {
        if (o instanceof Conductor) {
            Conductor c = (Conductor)o;
            return value.equals(c.value);
        }
        return false;
    }

    public void asignarTarea(Tarea t) {
        EmpresaTransportes et = EmpresaTransportes.getInstance();
        TareaPorHorarioComparator tphComparator = new TareaPorHorarioComparator();
        if (!t.programada()) {
            Collections.sort(tareasAsignadas, tphComparator);
            if (!tareasAsignadas.isEmpty()) {
                // Intentamos colocar la tarea al principio de la jornada 
                Tarea ti = tareasAsignadas.get(0);
                if (et.getHorarioEmpresa().horaInicio + t.duracion() <= ti.h.horaInicio) {
                    t.h.horaInicio = et.getHorarioEmpresa().horaInicio;
                    t.h.horaFin = t.h.horaInicio + t.duracion();
                } else {
                    for (int i = 0, j = 1; j < tareasAsignadas.size(); ++i, ++j) {
                        ti = tareasAsignadas.get(i);
                        Tarea tj = tareasAsignadas.get(j);
                        if (Tarea.tiempoEntreTareas(ti, tj) >= t.duracion()) {
                            if (ti.h.horaInicio < tj.h.horaInicio) {
                                t.h.horaInicio = ti.h.horaFin;
                                t.h.horaFin = t.h.horaInicio + t.duracion();
                            } else {
                                t.h.horaInicio = tj.h.horaFin;
                                t.h.horaFin = t.h.horaInicio + t.duracion();
                            }
                            break;
                        }

                    }
                    if (t.h.horaInicio == -1) {
                        t.h.horaInicio = tareasAsignadas.get(tareasAsignadas.size()-1).h.horaFin;//tareasAsignadas.getLast().h.horaFin;
                        t.h.horaFin = t.h.horaInicio + t.duracion();
                    }
                }
            } else { // primera tarea asignada es una no planificada
                     // (las tareas no planificadas se asignan las ultimas)
                t.h.horaInicio = et.getHorarioEmpresa().horaInicio;
                t.h.horaFin = t.h.horaInicio + t.duracion();
            }
        }
        tareasAsignadas.add(t);
    }

    public void deasignarTarea(Tarea t) {
        if (!t.programada()) {
            t.h.horaInicio = -1;
            t.h.horaFin = -1;
        }
        tareasAsignadas.remove(t);
    }

    public int numTareasAsignadas() {
        return tareasAsignadas.size();
    }

    public boolean tareasSuperpuestas() {
        for (Tarea t1 : tareasAsignadas) {
            for (Tarea t2 : tareasAsignadas) {
                if (!t1.equals(t2) && t1.seSolapan(t2))
                    return true;
            }
        }
        return false;
    }

}
